//********************************************************************
//	created:	13:2:2012   17:01
//	filename: 	xmlrpcexception.h
//	author:		tiamo
//	purpose:	xmlrpc exception
//********************************************************************

#pragma once

//
// xmlrpc
//
namespace xmlrpc
{
	//
	// exception
	//
	class Exception : public utils::Exception
	{
	public:
		//
		// code
		//
		enum
		{
			//
			// internal error
			//
			InternalError													= -500,

			//
			// type error
			//
			TypeError														= -501,

			//
			// index error
			//
			IndexError														= -502,

			//
			// parse error
			//
			ParseError														= -503,

			//
			// network error
			//
			NetworkError													= -504,

			//
			// timeout error
			//
			TimeoutError													= -505,

			//
			// no such method error
			//
			NoSuchMethodError												= -506,

			//
			// request refused error
			//
			RequestRefusedError												= -507,

			//
			// introspection disabled error
			//
			IntrospectionDisabledError										= -508,

			//
			// limit exceeded error
			//
			LimitExceededError												= -509,

			//
			// invalid utf8 error
			//
			InvalidUtf8Error												= -510,
		};

	public:
		//
		// constructor
		//
		Exception(char const* fileName, int fileLine, char const* functionName, int32_t xmlrpcErrorCode, wchar_t const* format, ...) throw ();

		//
		// destructor
		//
		virtual ~Exception() throw()										{}

		//
		// get code
		//
		int32_t getCode() const throw()										{return mCode;}

	private:
		//
		// code
		//
		int32_t																mCode;
	};

#define ThrowXmlRpcException(code, ...)										throw xmlrpc::Exception(__FILE__, __LINE__, __FUNCTION__, code, __VA_ARGS__)
}
